import { onMounted, ref } from 'vue'
import { cancelOrder, delOrder, followApi, getPrescriptionPic } from '@/services/consult'
import { showImagePreview } from 'vant'
import type { ConsultOrderItem } from '@/types/consult'
import { OrderType } from '@/enums'
import { error, success } from '@/utils/tools'
import type { OrderDetail } from '@/types/order'
import { getMedicalOrderDetail } from '@/services/order'
// 封装逻辑，规范 useXxx，表示使用某功能

// 实现关注和不关注
export const useFollow = (type: 'topic' | 'knowledge' | 'doc' | 'disease' = 'doc') => {
  // loading效果
  const loading = ref(false)
  // 关注的动作
  const follow = async (item: { id: string, likeFlag: 0 | 1 }) => {
    loading.value = true
    // 调接口更改
    await followApi(item.id, type)
    // 更改当前dom的状态(更改prop),正常prop是只读的，不能修改，但是我们的item是对象，是引用的类型的数据，可以修改，但是尽量使用
    item.likeFlag = item.likeFlag === 1 ? 0 : 1
    loading.value = false
  }
  return {
    loading,
    follow
  }
}

// 查看处方
export const useShowPrescription = () => {
  const showPrescription = async (id?: string) => {
    if (id) {
      const res = await getPrescriptionPic(id)
      // 实现图片预览
      showImagePreview([res.data.url])
    }
  }
  return { showPrescription }
}

// 取消订单
export const useCancelOrder = () => {
  const loading = ref(false)
  const cancelConsultOrder = async (item: ConsultOrderItem) => {
    loading.value = true
    try {
      await cancelOrder(item.id)
      // 正常应该去父组件去修改订单状态为已取消，但是因为我们传过来的item是对象，是引用传值，所以可以直接修改
      item.status = OrderType.ConsultCancel
      success('取消成功')
    } catch (err) {
      // todo
      error('取消失败')
    } finally {
      // 不管成功和失败都要走这里
      loading.value = false
    }
  }
  return { loading, cancelConsultOrder }
}


// 删除订单
// cb是外部使用这个函数时传入的函数
export const useDelOrder = (cb: (id: string) => void) => {
  const loading = ref(false)
  const deleteOrder = async (item: ConsultOrderItem) => {
    loading.value = true
    try {
      delOrder(item.id)
      success('删除订单成功')
      // 在订单item页面删除时，需要通知订单列表页去删除该条数据
      // 在订单详情页删除时，只需要跳转到订单列表页
      cb && cb(item.id)
    } catch {
      error('删除订单失败')
    } finally {
      loading.value = false
    }
  }
  return { loading, deleteOrder }
}

// 获取药品订单详情
export const useOrderDetail = (orderId: string) => {
  // 订单详情数据
  const order = ref<OrderDetail>()
  onMounted(async () => {
    if (orderId) {
      // 获取订单详情
      const res = await getMedicalOrderDetail(orderId)
      order.value = res.data
    }
  })
  return { order }
}